import logging      # Python内置的日志模块,用来记录信息
import os           # 用来创建文件之类的

"""
    日志记录代码的总结
        1- 该代码文件几乎你不会去写，要么是从历史项目中复制过来或者通过大模型生成
        2- 日志级别
            2.1- 级别高低：debug < info < warning < error < crit(严重错误)
            2.2- 实际工作中如何设置
                开发环境：debug
                test测试环境：debug或者info
                prod生产环境：info或者warning。绝对不能设置为debug或者crit，原因如下：
                    设置为debug会导致无效日志内容过多；设置crit会导致error信息无法记录
"""


class Logger(object):
    # 日志级别关系映射
    """
        error必须要处理，实际工作中的线上环境日志级别一般是info或者warning。

        为什么不是debug级别？
        因为会产生非常多的无价值日志，会占用非常多的磁盘空间。
    """
    level_relations = {
        'debug': logging.DEBUG,
        'info': logging.INFO,
        'warning': logging.WARNING,
        'error': logging.ERROR,
        'crit': logging.CRITICAL
    }

    def __init__(self, root_path, log_name, level='info', fmt='%(asctime)s - %(levelname)s: %(message)s'):
        # 指定日志保存的路径
        self.root_path = root_path

        # 初始logger名称和格式
        self.log_name = log_name

        # 初始日志格式模板
        self.fmt = fmt

        # 先创建一个 Logger实例对象
        self.logger = logging.getLogger(log_name)

        # 设置日志级别
        self.logger.setLevel(self.level_relations.get(level))

    # 创建日志文件类方法
    def get_logger(self):
        # 指定对应的 Handler 为 FileHandler 对象， 这个可适用于多线程情况
        path = os.path.join(self.root_path, 'logs')              # 把根路径和子目录 'log' 拼接起来
        os.makedirs(path, exist_ok=True)
        file_name = os.path.join(path, self.log_name + '.log')  # 构造完整日志文件路径
        rotate_handler = logging.FileHandler(file_name, encoding="utf-8", mode="a")

        # Handler 对象 rotate_handler 的输出格式
        formatter = logging.Formatter(self.fmt)
        rotate_handler.setFormatter(formatter)

        # 将rotate_handler添加到Logger
        self.logger.addHandler(rotate_handler)

        return self.logger


if __name__ == '__main__':
    logger_obj = Logger(root_path="../", log_name="power_load").get_logger()
    logger_obj.info("这是一条info级别的日志")
    logger_obj.error("这是一条error级别的日志")

    # logger_obj = Logger(root_path="../", log_name="power_load","debug").get_logger()
    # 该条日志不会写到文件中，因为默认的日志级别是info。如果需要记录，那么需要将level设置为debug
    logger_obj.debug("debug日志")
